#define _CRT_SECURE_NO_WARNINGS 1
#include<stdio.h>
#include<string.h>
#include<assert.h>

//整形家族
//浮点型家族
//构造类型-自定义类型
//数组
//	struct结构体类型
//	enum枚举
//  union联合体

//指针类型

//空类型
// void
// 函数返回类型voidtest();
// 函数参数voidtest（void）
// 指针void*p;



//数据在内存中以2进制的形式存储
//对于整数来说：
//整数二进制有3种表示形式：原码、反码、补码
//正整数：原码、反码、补码相同
//负整数：原码、反码、补码要进行计算的
int main()
{
	  int  a = -10;
	//10000000000000000001010 -原码
	//11111111111111111110101 -反码
	//11111111111111111110110 -补码
	//FFFFFFF6   //(整数中在内存中存储的是补码
	     //在计算机系统中，数值一律用补码来表示和存储。原因在于，使用补码，可以将符号位和数值域统一处理；
		//同时，加法和减法以统一外理（CPU只有加法器）此外，补码与原码相互转换，其运算过程是相同的，不需要额外的硬件电路。

	//按照数据的数值直接写出的二进制序列就是原码
	//原码的符号位不变，其他位按位取反，得到的就是反码
	//反码+1，得到的就是补码
	  

	   //倒着看是小段存储，内存存储地址分为，大端存储和小段存储
	 

	//什么大端小端：
	//	大端（存储）模式，是指数据的低位保存在内存的高地址中，而数据的高位，保存在内存的低地址中；
	//	小端（存储）模式，是指数据的低位保存在内存的低地址中，而数据的高位，，保存在内存的高地址中。



//请简述大端字节序和小端字节序的概念，设计一个程序来判断当前机器的字节序。
//判断一个16进制的顺序就好了

int check_sys()
{
	int a = 1;
	char* p = (char*)&a;
	if ( *p == 1)
	{
		return 1;
	else
	{
		return 0;
	}		
}
/*
int check_sys()
{
	int a = 1;
	char* p = (char*)&a;
	return *p; //返回1表示小端，返回0表示大端
}
*/

	/*
	int a = 1;
	//int型  有四个字节  判断大小端 取第一个字节就好
	 //char*p *p其实就是访问一个字节
	 
	char* p = (char*)&a; // int * 被强制类型转换
	if (*p==1)
	{
		printf("小端\n");
	}
	else
	{
		printf("大端\n");
	}
	*/

	//用函数表示
	int ret = check_sys();

	if(ret == 1) 
	{
		printf("小端\n");
	}
	else
	{
		printf("大端\n");
	}

    return 0;
}




